/*
 * jquery-counter plugin
 *
 * Copyright (c) 2009 Martin Conte Mac Donell <Reflejo@gmail.com>
 * Dual licensed under the MIT and GPL licenses.
 * http://docs.jquery.com/License
 */
jQuery.fn.countdown = function(userOptions) {
	// Default options
	var options = {
		stepTime : 60,
		// startTime and format MUST follow the same format.
		// also you cannot specify a format unordered (e.g. hh:ss:mm is wrong)
		format : "hh:mm:ss",
		startTime : "12:32:55",
		digitImages : 6,
		digitWidth : 53,
		digitHeight : 77,
		timerEnd : function() {
		},
		image: 'image/digits.png'
	};
	var digits = [], interval;

	// Draw digits in given container
	var createDigits = function(where) {
		var c = 0;
		// Iterate each startTime digit, if it is not a digit
		// we'll asume that it's a separator
		for ( var i = 0; i < options.startTime.length; i++) {
			if (parseInt(options.startTime[i]) >= 0) {
				elem = $('<div id="cnt_' + i + '" class="cntDigit" />').css({
					height : options.digitHeight * options.digitImages * 10,
					float : 'left',
					background : 'url(\'' + options.image + '\')',
					width : options.digitWidth
				});
				digits.push(elem);
				margin(c, -((parseInt(options.startTime[i])
						* options.digitHeight * options.digitImages)));
				digits[c].__max = 9;
				// Add max digits, for example, first digit of minutes (mm) has 
				// a max of 5. Conditional max is used when the left digit has reach
				// the max. For example second "hours" digit has a conditional max of 4 
				switch (options.format[i]) {
				case 'h':
					digits[c].__max = (c % 2 == 0) ? 2 : 9;
					if (c % 2 == 0)
						digits[c].__condmax = 4;
					break;
				case 'd':
					digits[c].__max = 9;
					break;
				case 'm':
				case 's':
					digits[c].__max = (c % 2 == 0) ? 5 : 9;
				}
				++c;
			} else
				elem = $('<div class="cntSeparator"/>').css({
					float:'left', 'font-size': options.digitWidth + 'px'
				}).text(options.startTime[i]);

			where.append(elem);
		}
	};

	// Set or get element margin
	var margin = function(elem, val) {
		if (val !== undefined)
			return digits[elem].css({
				'marginTop' : val + 'px'
			});

		return parseInt(digits[elem].css('marginTop').replace('px', ''));
	};

	// Makes the movement. This is done by "digitImages" steps.
	var moveStep = function(elem) {
		digits[elem]._digitInitial = -(digits[elem].__max * options.digitHeight * options.digitImages);
		return function _move() {
			mtop = margin(elem) + options.digitHeight;
			if (mtop == options.digitHeight) {
				margin(elem, digits[elem]._digitInitial);
				if (elem > 0)
					moveStep(elem - 1)();
				else {
					clearInterval(interval);
					for ( var i = 0; i < digits.length; i++)
						margin(i, 0);
					options.timerEnd();
					return;
				}
				if ((elem > 0) && (digits[elem].__condmax !== undefined)
						&& (digits[elem - 1]._digitInitial == margin(elem - 1)))
					margin(
							elem,
							-(digits[elem].__condmax * options.digitHeight * options.digitImages));
				return;
			}

			margin(elem, mtop);
			if (margin(elem) / options.digitHeight % options.digitImages != 0)
				setTimeout(_move, options.stepTime);

			if (mtop == 0)
				digits[elem].__ismax = true;
		};
	};

	$.extend(options, userOptions);
	createDigits(this);
	interval = setInterval(moveStep(digits.length - 1), 1000);
	this.css({
		height : options.digitHeight,
		overflow : 'hidden'
	});
	
	return interval;
};
